// var i;
// var $logManager = require("./LogManager");
// var $resLoader = require("./ResLoader");
// var l = cc._decorator.ccclass;
// var u = (function (e) {
//     function t() {
//         var t = (null !== e && e.apply(this, arguments)) || this;
//         t._autoRes = [];
//         return t;
//     }
//     __extends(t, e);
//     t.prototype._loadRes = function (e, t, o) {
//         var n = this;
//         return new Promise(function (i) {
//             $resLoader.default.loadRes(e, t, o).then(function (e) {
//                 if (e) {
//                     n.autoReleaseRes(e);
//                 }
//                 i(e);
//             });
//         });
//     };
//     t.prototype.onDestroy = function () {
//         var e = this._autoRes.map(function (e) {
//             return e.name;
//         });
//         $logManager.LogMgr.debug("auto release all resources: " + JSON.stringify(e));
//         this._releaseAutoRes();
//     };
//     t.prototype._releaseAutoRes = function () {
//         for (var e = 0; e < this._autoRes.length; e++) {
//             this._autoRes[e].decRef();
//         }
//         this._autoRes.length = 0;
//     };
//     t.prototype.autoReleaseRes = function (e) {
//         e.addRef();
//         this._autoRes.push(e);
//     };
//     return __decorate([l], t);
// })(cc.Component);
// exports.default = u;


// import { LogMgr } from './LogManager';
// import ResLoader from './ResLoader';
// const { ccclass } = cc._decorator;

// /**
//  * 资源管理类
//  * 建议类名：ResourceManager
//  */
// @ccclass
// export default class ResKeeper extends cc.Component {
//     private _autoRes: any[] = [];

//     constructor() {
//         super();
//     }

//     /**
//      * 加载资源
//      * @param e 资源路径
//      * @param t 资源类型
//      * @param o 资源加载选项
//      * @returns Promise<any>
//      * 建议方法名：loadResource
//      */
//     protected _loadRes(bundleName: string | cc.AssetManager.Bundle, resourcePath: string, type: typeof cc.Asset): Promise<any> {
//         return new Promise((resolve) => {
//             ResLoader.loadRes(bundleName, resourcePath, type).then((resource: any) => {
//                 if (resource) {
//                     this.autoReleaseRes(resource);
//                 }
//                 resolve(resource);
//             });
//         });
//     }

//     /**
//      * 组件销毁时调用
//      * 建议方法名：onComponentDestroy
//      */
//     onDestroy() {
//         const resourceNames = this._autoRes.map((res) => res.name);
//         LogMgr.debug("auto release all resources: " + JSON.stringify(resourceNames));
//         this._releaseAutoRes();
//     }

//     /**
//      * 释放自动管理的资源
//      * 建议方法名：releaseAutoResources
//      */
//     private _releaseAutoRes() {
//         for (let i = 0; i < this._autoRes.length; i++) {
//             this._autoRes[i].decRef();
//         }
//         this._autoRes.length = 0;
//     }

//     /**
//      * 自动释放资源
//      * @param e 资源
//      * 建议方法名：autoReleaseResource
//      */
//     public autoReleaseRes(e: any) {
//         e.addRef();
//         this._autoRes.push(e);
//     }
// }

import { LogMgr } from './LogManager';
import ResLoader from './ResLoader';
const { ccclass } = cc._decorator;

/**
 * 资源管理类
 * 建议类名：ResourceManager
 */
@ccclass
export default class ResKeeper extends cc.Component {
    private _autoResList: any[] = [];

    constructor() {
        super();
    }

    /**
     * 加载资源
     * @param bundleName 资源包名或资源包对象
     * @param resourcePath 资源路径
     * @param resourceType 资源类型
     * @returns Promise<any>
     * 建议方法名：loadResource
     */
    protected _loadRes(bundleName: string | cc.AssetManager.Bundle, resourcePath: string, resourceType: typeof cc.Asset): Promise<any> {
        return new Promise((resolve) => {
            ResLoader.loadRes(bundleName, resourcePath, resourceType).then((loadedResource: any) => {
                if (loadedResource) {
                    this.autoReleaseRes(loadedResource);
                }
                resolve(loadedResource);
            });
        });
    }

    /**
     * 组件销毁时调用
     * 建议方法名：onComponentDestroy
     */
    onDestroy() {
        const resourceNames = this._autoResList.map((resource) => resource.name);
        LogMgr.debug("auto release all resources: " + JSON.stringify(resourceNames));
        this._releaseAutoResList();
    }

    /**
     * 释放自动管理的资源
     * 建议方法名：releaseAutoResources
     */
    private _releaseAutoResList() {
        for (let resource of this._autoResList) {
            resource.decRef();
        }
        this._autoResList.length = 0;
    }

    /**
     * 自动释放资源
     * @param resource 资源
     * 建议方法名：autoReleaseResource
     */
    public autoReleaseRes(resource: any) {
        resource.addRef();
        this._autoResList.push(resource);
    }
}